import { getAccessToken } from '@/utils/auth'

// 新增图片类型判断
const imageExtensions = ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp']
const unsupportedExtensions = [
	// 压缩包类型
	'zip', 'rar', '7z', 'tar', 'gz',
	// 可执行文件类型
	'exe', 'bat', 'cmd', 'sh', 'msi',
	// 其他二进制文件
	'dmg', 'iso', 'bin', 'txt'
]

/**
 * 根据文件URL判断文件类型
 * @param fileUrl - 文件完整URL地址
 * @returns 文件类型标识: 'image' | 'pdf' | 'doc' | 'xls' | 'ppt' | '' (其他返回空)
 */
const getFileExtension = (fileUrl: string): string => {
	// 步骤1: 提取纯净的文件名（去除URL参数和路径）
	const cleanFileName = fileUrl
		.split('?')[0]    // 去除参数字符串
		.split('/')       // 拆分路径
		.pop()            // 取最后一段作为文件名
		|| '';            // 防空处理

	// 步骤2: 提取小写的文件扩展名
	const extension = cleanFileName.includes('.')
		? cleanFileName.split('.').pop()!.toLowerCase()
		: '';
	//  判断不支持的文件类型
	if (unsupportedExtensions.includes(extension)) {
		return 'unsupported';
	}
	//  判断图片文件类型
	if (imageExtensions.includes(extension)) {
		return 'image';
	}

	// 步骤4: 使用对象映射提升可读性和扩展性
	const typeMap: Record<string, string> = {
		pdf: 'pdf',
		doc: 'doc',
		docx: 'doc',
		xls: 'xls',
		xlsx: 'xls',
		ppt: 'ppt',
		pptx: 'ppt',
	};

	return typeMap[extension] || '';
}
const downloadFile = (fileUrl: string) => {
	fileUrl = fileUrl.trim();
	return new Promise<UniApp.DownloadSuccessData>((resolve, reject) => {
		uni.downloadFile({
			url: fileUrl,
			header: {
				Authorization: 'Bearer ' + getAccessToken()
			},
			success: (res) => {
				console.log('downloadFile success 回调 res:', res) // ✅ 打印成功回调信息
				if (res.statusCode === 200) {
					resolve(res)
				} else {
					console.error('downloadFile statusCode 非200:', res.statusCode)
					reject(new Error('下载失败: ' + res.statusCode))
				}
			},
			fail: (err) => {
				console.error('downloadFile fail 回调 err:', err) // ✅ 打印失败回调信息
				reject(err)
			}
		})
	})
}
// 文件的预览方法
export const previewFile = async (fileUrl: string) => {
	console.log('fileUrl', fileUrl);

	try {

		const extension = getFileExtension(fileUrl)
		console.log('extension', extension);

		// 检查不支持的类型
		if (extension === 'unsupported') {
			uni.showToast({ title: '该文件类型不支持预览', icon: 'none', duration: 2000 })
			return
		}
		// 如果是图片类型
		if (extension === 'image') {
			uni.previewImage({
				current: fileUrl,
				urls: [fileUrl]
			})
			return
		}
		// 如果是文档类型
		uni.showLoading({ title: '正在加载文件...', mask: true })
		const res = await downloadFile(fileUrl)
		console.log('下载成功', res.tempFilePath)
		console.log('res', res);

		console.log('tempFilePath', res.tempFilePath);

		await uni.openDocument({
			filePath: res.tempFilePath,
			fileType: getFileExtension(fileUrl),
			showMenu: true
		})

	} catch (error) {
		uni.showToast({

			title: '文件预览失败', icon: 'none', duration: 2000
		})
	} finally {
		uni.hideLoading()
	}
}

//附件图片/文档数据回显
export const buildFileList = (
	attachments: string | string[] | undefined,
	name?: string | string[]
): { url: string; name?: string }[] => {
	if (!attachments) return [];

	// 单个对象构建逻辑
	const toFileObj = (url: string, nameOverride?: string) => ({
		url,
		name: nameOverride ?? (url.split('/').pop() || '附件')
	});

	if (Array.isArray(attachments)) {
		// attachments 是数组时
		if (Array.isArray(name)) {
			// name 也是数组
			return attachments.map((url, index) => toFileObj(url, name[index]));
		} else {
			// name 是单个值或 undefined
			return attachments.map(url => toFileObj(url, name));
		}
	} else {
		// attachments 是单个字符串
		return [toFileObj(attachments, Array.isArray(name) ? name[0] : name)];
	}
};


//解析嵌套属性
export const getNestedValue = (obj: any, path: any) => {
	return path.split('.').reduce((acc: any, part: any) => acc && acc[part], obj);
}

/**
 * 解析数组或伪数组
 * @param str - 传入后端返回的数组字符串
 * 
 */
export function parseArrayField(str: string) {
	if (!str) return null;

	// 1️⃣ 如果字符串外面有多余一层双引号，先去掉
	while (str.startsWith('"') && str.endsWith('"') && str.length > 2) {
		str = str.slice(1, -1);
	}
	console.log('str字符串', str);

	// 2️⃣ 先尝试 JSON.parse（单引号时直接成功）
	try {
		const arr = JSON.parse(str);
		if (Array.isArray(arr)) {
			return arr.map(String); // 确保每个元素都是字符串
		}

	} catch {
		// 3️⃣ 解析失败时，尝试处理伪数组 [http://xxx]
		if (/^\[[^\[\]"]+\]$/.test(str)) {
			console.log('str.slice', str.slice(1, -1).trim());
			const content = str.slice(1, -1).trim();
			// 用逗号分隔，并去掉首尾空格
			return content.split(',').map(s => s.trim()).filter(Boolean);
		}
	}

	return str ? str : [];
}

//获取url或者name后面的文件名
export const getFileName = (input: string, options?: { isUrl?: boolean, maxLength?: number }) => {
	if (!input || input.length === 0) return null

	const { isUrl = false, maxLength = 20 } = options || {}

	const fullName = isUrl ? input.split('/').pop() || '' : input

	const lastDotIndex = fullName.lastIndexOf('.')
	const name = lastDotIndex !== -1 ? fullName.slice(0, lastDotIndex) : fullName
	const ext = lastDotIndex !== -1 ? fullName.slice(lastDotIndex) : ''

	if (name.length > maxLength) {
		return name.slice(0, maxLength) + '...' + ext
	}

	return fullName
}